package com.ruoyi.udp_server;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

@Component
public class UdpServerRunner implements CommandLineRunner {

    @Value("${udp.server.port:8778}") // 使用配置文件中的端口，如果没有则默认为8778
    private int port;

    @Autowired
    private QGCMessageHanding qgcMessageHanding;

    @Override
    public void run(String... args) {
        startUdpServer(port);
    }

    /**
    * 启动UDP服务器。
    * 该方法创建一个UDP服务器，监听指定端口上的数据包。一旦接收到数据包，它将打印发送方的地址和端口以及数据包的内容。
    *
    * @param port 服务器监听的端口号。
    */
    private void startUdpServer(int port) {
        try (DatagramSocket serverSocket = new DatagramSocket(port)) {
            System.out.println("UDP Server started on port " + port);
            // 创建一个字节数组用于接收数据包的内容
            byte[] receiveData = new byte[65535];
            while (true) {
                // 创建一个DatagramPacket对象，用于接收来自客户端的数据包。
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                // 阻塞接收数据包。
                serverSocket.receive(receivePacket);
                // 将接收到的字节数组转换为字符串，以获取数据包的内容
                String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
//                System.out.println("receivedMessage:" + receivedMessage);

                qgcMessageHanding.MessageHanding(receivedMessage);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Error in UDP server: " + e.getMessage());
        }
    }
}
